package br.unicamp.ic.inf312.arena.controle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


import br.unicamp.ic.inf312.arena.modelo.logistico.Evento;
import br.unicamp.ic.inf312.arena.modelo.pessoa.Aposentado;
import br.unicamp.ic.inf312.arena.modelo.pessoa.Comprador;
import br.unicamp.ic.inf312.arena.modelo.pessoa.Espectador;
import br.unicamp.ic.inf312.arena.modelo.pessoa.Estudante;
import br.unicamp.ic.inf312.arena.modelo.pessoa.Profissional;
import br.unicamp.ic.inf312.arena.modelo.vendas.Bilhete;
import br.unicamp.ic.inf312.arena.modelo.vendas.BilheteInteiro;
import br.unicamp.ic.inf312.arena.modelo.vendas.BilheteMeiaEntrada;
import br.unicamp.ic.inf312.arena.modelo.vendas.CartaoCredito;
import br.unicamp.ic.inf312.arena.modelo.vendas.Compra;
import br.unicamp.ic.inf312.arena.modelo.vendas.Pagamento;
import br.unicamp.ic.inf312.arena.modelo.vendas.TransacaoCompraGerenciador;
import br.unicamp.ic.inf312.arena.visao.eventoscartaz.EventosEmCartaz;
import br.unicamp.ic.inf312.arena.visao.vendas.BilhetesEmitidosTableModel;
import br.unicamp.ic.inf312.arena.visao.vendas.CompraBilhete;
import br.unicamp.ic.inf312.framework.util.FrameworkUtil;

public class ComprarBilhete implements ActionListener {
	private CompraBilhete visao;
	private Compra modelo;
	private Evento eventoSelecionado;
	private EventosEmCartaz visaoEventosEmCartaz;

	/**
	 * 
	 * @param visao
	 */
	public ComprarBilhete(CompraBilhete visao, Compra compra,
			EventosEmCartaz visaoEventosEmCartaz) {
		super();
		this.visao = visao;
		this.modelo = compra;
		this.visaoEventosEmCartaz = visaoEventosEmCartaz;

		// visao define quem eh seu controlador
		visao.addActionListener(this);
	}

	/**
	 * 
	 * @param visao
	 */
	public ComprarBilhete(CompraBilhete visao, Compra compra, Evento evento,
			EventosEmCartaz visaoEventosEmCartaz) {
		super();
		this.visao = visao;
		this.modelo = compra;
		this.eventoSelecionado = evento;
		this.visaoEventosEmCartaz = visaoEventosEmCartaz;

		//visao define quem eh seu controlador
		visao.addActionListener(this);
	}

	/**
	 * Controla eventos da visao
	 */
	public void actionPerformed(ActionEvent ev) {
        try {
    	    if ( ev.getActionCommand().equals("Identificar") ) {
    	    	//popula objeto compra
    	    	modelo.getBilhetes().add( this.gerarBilhete() );
    	    }
    	    else if( ev.getActionCommand().equals("AdicionarBilhete") ) {
    	    	//c/ so envolve visibilidade esta sendo tratado na visao!
    	    }
    	    else if( ev.getActionCommand().equals("Confirmar") ) {
    	    	this.efetivarCompra();
    	    }
    	    else if( ev.getActionCommand().equals("Fechar") ) {
    			visao.dispose();
    			if (visaoEventosEmCartaz != null) {
    				visaoEventosEmCartaz.initializeEventosEmCartaz();
    			}
    	    }
        } catch (Exception ex) {
        	ex.printStackTrace();
    	}
	}

	/**
	 * 
	 * @return {TRUE, FALSE}
	 */
	private boolean efetivarCompra() {
		//TRATAR #s TIPOS PAGTO. {CARTAO, VALE}
		CartaoCredito pagto = null;
		try {
			pagto = new CartaoCredito();
			pagto.setNumeroCartao( Long.valueOf( visao.getTxtNumCartao().getText() ) );
			//
			modelo = TransacaoCompraGerenciador.efetivarCompra(modelo.getBilhetes(),
					pagto);
			//
			populaVisaoTabelaBilhetes();
			
			//
			return true;			
		} catch (Exception e) {
			e.printStackTrace();
			
			//TODO: Alteracao para a ativ. 9
			visao.mostrarInformacoes("Compra Cancelada");
			
			return (false);
		}
	}
	
	/**
	 * Dados fechamento compra I:
	 *  num. protocolo da compra, data, valor total, tipo do pagamento 
	 *
	 */
	private void populaVisaoTabelaBilhetes() {
		StringBuffer stbDadosCompraI = new StringBuffer();
		//num. protocolo
		stbDadosCompraI.append(" Num. protocolo da compra: "
				+ modelo.getNumProtocolo() );
		//dataHora
		stbDadosCompraI.append("  Data: "
				+ FrameworkUtil.formatarData( modelo.getDataHora() ));
		//valor
		stbDadosCompraI.append("  Valor total a pagar: "
				+ modelo.getPagamento().getValor() );
		//tipo pagto.
		stbDadosCompraI.append("  Tipo pagamento: "
				+ Pagamento.obterDescricaoTipoPagamento( modelo.getPagamento()
						.getTipo()) );
		//
		visao.setJLabelDadosCompra( stbDadosCompraI.toString() );

		//
		visao.getJTableTabelaBilhetes().setModel(
				new BilhetesEmitidosTableModel( modelo.getBilhetes() ));
		
		visao.getJScrollPaneTabelaBilhetes().setViewportView(
				visao.getJTableTabelaBilhetes() );
	}

	/**
	 * A partir da entrada de dados gera Bilhete = {Meia-entrada, Entrada-inteira}
	 * 
	 * @return Bilhete
	 * 
	 */
	private Bilhete gerarBilhete() {
		Bilhete bilhete = null;
		Espectador espectador = null;
		
		//TODO: Alteracao para a ativ. 6
		//TODO: Alteracao para a ativ. 8
		if ( visao.isEstudante() )
		{
			espectador = new Estudante();
			bilhete = new BilheteMeiaEntrada();
		}			
		else if ( visao.isAposentado() )
		{
			espectador = new Aposentado();
			bilhete = new BilheteMeiaEntrada();
		}			
		else
		{
			espectador = new Profissional();
			bilhete = new BilheteInteiro();
		}
		
		espectador.setDocumento(visao.getDocumentoEspectador());
		bilhete.setEspectador(espectador);
		bilhete.setEvento(eventoSelecionado);
		System.out.println("\n\n***** bilhete gerado: " + bilhete);
		System.out.println("\n\n***** valor calculado p/ o bilhete gerado: "
				+ bilhete.getValor());
		return bilhete;
	}
}